package demo3

import "fmt"

/*
	for range 循环
	1. for range 结构是 Go语言特有的一种的迭代结构，在许多情况下都非常有用。
			for range 可以迭代任何一个集合（包括数组和 map）。
			语法上很类似其它语言中 foreach 语句，但依旧可以获得每次迭代所对应的索引。一般形式为：
			for ix, val := range coll { } 。
	2. 需要要注意的是， val 始终为集合中对应索引的值拷贝，
			因此它一般只具有只读性质，对它所做的任何修改都不会影响到集合中原有的值（如果 val 为指针，则会产生指针的拷贝，
			依旧可以修改集合中的原值）。一个字符串是 Unicode 编码的字符（或称之为 rune ）集合，因此也可以用它迭代字符串：
	3. 每个 rune 字符和索引在 for-range 循环中是一一对应的。它能够自动根据 UTF-8 规则识别 Unicode 编码的字符。
	4. Go语言中可以使用 for range 遍历数组、切片、字符串、map 及通道（channel）。通过 for range 遍历的返回值有一定的规律：
			4.1 数组、切片、字符串返回索引和值。
			4.2 map 返回键和值。
			4.3 通道（channel）只返回通道内的值。
*/

// TestDemo35 for range 键值对循环
func TestDemo35() {
	/* 1.数组、切片遍历 */
	for k, v := range []int{10, 20, 30} {
		fmt.Printf("key is %d, value is %d\n", k, v)
	}

	/*
		2.遍历字符串——获得字符
			1. Go 语言和其他语言类似，可以通过 for range 的组合，对字符串进行遍历，
			2. 遍历时，key 和 value 分别代表字符串的索引（base0）和字符串中的每一个字符。
			3. 代码中的 v 变量，实际类型是 rune，实际上就是 int32，以十六进制打印出来就是字符的编码。
	*/
	var str = "Hello World"
	for k, v := range str {
		// fmt.Printf("key is %d, value is %d\n", k, v)
		fmt.Printf("key is %d, value is 0x%x\n", k, v)
	}
}
